package controllers

import (
	"2301a-user2/cache"
	"2301a-user2/models"
	"encoding/json"
	"fmt"
	beego "github.com/beego/beego/v2/server/web"
)

type ArticleController struct {
	beego.Controller
}

// 注册
func (c *ArticleController) Register() {
	username := c.GetString("username")
	password := c.GetString("password")

	if username == "" || password == "" {
		res := Response{
			Code: 500,
			Msg:  "用户名或密码不能为空",
			Data: nil,
		}
		c.Data["json"] = res
		c.ServeJSON()
		return
	}

}

// 添加
func (c *ArticleController) Add() {
	//接收article结构体
	var article models.Article
	article.Title = c.GetString("title")
	article.Content = c.GetString("content")

	//判断为空
	if article.Title == "" || article.Content == "" {
		res := Response{
			Code: 500,
			Msg:  "标题或内容不能为空",
			Data: nil,
		}
		c.Data["json"] = res
		c.ServeJSON()
		return
	}

	if article.Creat() != nil {
		res := Response{
			Code: 500,
			Msg:  "文章添加失败",
			Data: nil,
		}
		c.Data["json"] = res
		c.ServeJSON()
		return
	}

	res := Response{
		Code: 200,
		Msg:  "文章添加成功",
		Data: nil,
	}
	c.Data["json"] = res
	c.ServeJSON()
	return

}

/**
 * @param  page 页数
 * @param  page_size 页数大小
 * 文章列表

**/

// 列表展示
func (c *ArticleController) List() {
	//分页
	page, _ := c.GetInt("page", 1)           //默认显示1页
	pageSize, _ := c.GetInt("page_size", 10) //默认每页显示10条数据
	//keyword := c.GetString("keyword")//搜索关键词
	//接收搜索标题
	title := c.GetString("title")
	//mysql中的文章列表
	var articles []*models.Article

	//缓存处理
	/*
		var articleJson string         //缓存中的文章列表
		var articles []*models.Article //mysql中的文章列表
		//从 redis 中获取文章列表
		articleJson, _ = cache.Rdb.Get(ctx, "article_list").Result()

		if articleJson != "" {
			//如果 redis 中存在文章列表，直接返回
			json.Unmarshal([]byte(articleJson), &articles)

		} else {
			//如果redis中没有文章列表，则从mysql中获取列表
			var article models.Article //文章结构体
			articles, _ = article.List(title, page, pageSize)
			//序列化
			a, _ := json.Marshal(articles)
			//将文章列表存入redis
			cache.Rdb.Set(ctx, "article_list", a, 0)
		}
	*/

	//从 redis 中获取文章列表
	cacheData := cache.Rdb.Get(ctx, "article_list").Val()
	if cacheData == "" {
		fmt.Println("从数据库中获取文章列表")
		var article models.Article
		articles, _ := article.List(title, page, pageSize)
		//序列化
		jsonData, _ := json.Marshal(articles)
		//设置过期时间
		cache.Rdb.Set(ctx, "article_list", jsonData, 0) //0为过期时间

	} else {
		fmt.Println("从redis缓存中获取文章列表")
		//反序列化
		json.Unmarshal([]byte(cacheData), &articles)
	}

	res := Response{
		Code: 200,
		Msg:  "文章列表获取成功",
		Data: articles,
	}
	c.Data["json"] = res
	c.ServeJSON()
	return
}
